#include <iostream>
#include <list>
#include <string>
#include <algorithm>
#include <fstream>
using namespace std;

// 学生类
class Student {
private:
    int num;        // 学号
    string name;    // 姓名
    char sex;       // 性别
    float score;    // 成绩

public:
    // 默认构造函数
    Student() : num(0), name(""), sex('M'), score(0.0) {}

    // 有参构造函数
    Student(int n, const string& nm, char s, float sc)
            : num(n), name(nm), sex(s), score(sc) {}

    // 复制构造函数
    Student(const Student& other)
            : num(other.num), name(other.name), sex(other.sex), score(other.score) {}

    // 设置信息函数
    void setInfo(int n, const string& nm, char s, float sc) {
        num = n;
        name = nm;
        sex = s;
        score = sc;
    }

    // 显示信息函数
    void displayInfo() const {
        cout << "学号: " << num << ", 姓名: " << name << ", 性别: " << sex
             << ", 成绩: " << score << endl;
    }

    // 获取学号
    int getNum() const { return num; }

    // 获取姓名
    string getName() const { return name; }

    // 获取性别
    char getSex() const { return sex; }

    // 获取成绩
    float getScore() const { return score; }
};

// 学生信息控制类
class StudentControl {
private:
    list<Student> listStu; // 使用 list 存储学生信息
    int num;               // 学生个数

public:
    // 构造函数
    StudentControl() : num(0) {}

    // 从文件加载学生信息
    void loadFromFile(const string& filename) {
        ifstream infile(filename);
        if (!infile) {
            cout << "文件打开失败！" << endl;
            return;
        }

        listStu.clear();
        int n;
        string nm;
        char s;
        float sc;
        while (infile >> n >> nm >> s >> sc) {
            listStu.emplace_back(n, nm, s, sc);
        }
        infile.close();
        num = listStu.size();
        cout << "从文件加载学生信息成功，共 " << num << " 名学生。" << endl;
    }

    // 显示所有学生信息
    void display() const {
        if (listStu.empty()) {
            cout << "没有学生信息！" << endl;
            return;
        }
        for (const auto& stu : listStu) {
            stu.displayInfo();
        }
    }

    // 增加学生信息
    void addStudent() {
        int n;
        string nm;
        char s;
        float sc;
        cout << "输入学号 姓名 性别 成绩: ";
        cin >> n >> nm >> s >> sc;
        listStu.emplace_back(n, nm, s, sc);
        num++;
        cout << "学生信息添加成功！" << endl;
    }

    // 删除学生信息
    void deleteStudent() {
        int n;
        cout << "输入要删除的学生学号: ";
        cin >> n;

        auto it = find_if(listStu.begin(), listStu.end(),
                          [n](const Student& stu) { return stu.getNum() == n; });

        if (it != listStu.end()) {
            listStu.erase(it);
            num--;
            cout << "学生信息删除成功！" << endl;
        } else {
            cout << "未找到学号为 " << n << " 的学生信息！" << endl;
        }
    }

    // 修改学生信息
    void modifyStudent() {
        int n;
        cout << "输入要修改的学生学号: ";
        cin >> n;

        auto it = find_if(listStu.begin(), listStu.end(),
                          [n](const Student& stu) { return stu.getNum() == n; });

        if (it != listStu.end()) {
            string nm;
            char s;
            float sc;
            cout << "输入新的姓名 性别 成绩: ";
            cin >> nm >> s >> sc;
            it->setInfo(n, nm, s, sc);
            cout << "学生信息修改成功！" << endl;
        } else {
            cout << "未找到学号为 " << n << " 的学生信息！" << endl;
        }
    }

    // 查询学生信息
    void queryStudent() const {
        int n;
        cout << "输入要查询的学生学号: ";
        cin >> n;

        auto it = find_if(listStu.begin(), listStu.end(),
                          [n](const Student& stu) { return stu.getNum() == n; });

        if (it != listStu.end()) {
            it->displayInfo();
        } else {
            cout << "未找到学号为 " << n << " 的学生信息！" << endl;
        }
    }

    // 按成绩排序
    void sortStudents() {
        listStu.sort([](const Student& a, const Student& b) {
            return a.getScore() > b.getScore(); // 按成绩降序排序
        });
        cout << "学生信息已按成绩排序！" << endl;
    }

    // 写入学生信息到文件
    void writeToFile(const string& filename) const {
        ofstream outfile(filename);
        if (!outfile) {
            cout << "文件打开失败！" << endl;
            return;
        }
        for (const auto& stu : listStu) {
            outfile << stu.getNum() << " " << stu.getName() << " "
                    << stu.getSex() << " " << stu.getScore() << endl;
        }
        outfile.close();
        cout << "学生信息已写入文件！" << endl;
    }

    // 析构函数
    ~StudentControl() {
        listStu.clear();
    }
};

// 主函数
int main() {
    StudentControl control;
    int choice;
    string filename = "D:students.txt";

    do {
        cout << "\n====== 学生信息管理系统 ======\n";
        cout << "1. 从文件加载学生信息\n";
        cout << "2. 显示所有学生信息\n";
        cout << "3. 增加学生信息\n";
        cout << "4. 删除学生信息\n";
        cout << "5. 修改学生信息\n";
        cout << "6. 查询学生信息\n";
        cout << "7. 按成绩排序\n";
        cout << "8. 写入学生信息到文件\n";
        cout << "0. 退出\n";
        cout << "请选择: ";
        cin >> choice;

        switch (choice) {
            case 1:
                control.loadFromFile(filename);
                break;
            case 2:
                control.display();
                break;
            case 3:
                control.addStudent();
                break;
            case 4:
                control.deleteStudent();
                break;
            case 5:
                control.modifyStudent();
                break;
            case 6:
                control.queryStudent();
                break;
            case 7:
                control.sortStudents();
                break;
            case 8:
                control.writeToFile(filename);
                break;
            case 0:
                cout << "退出系统！" << endl;
                break;
            default:
                cout << "无效选择，请重试！" << endl;
        }
    } while (choice != 0);

    return 0;
}
